#include <iostream>
#include <string>

// 下面来讲讲函数的构造器, 其实c++中称作这叫做构造函数
//
// 类的构造函数和析构函数
// 函数的声明部分依然是用的是 DefineAClass
#include "39OOP-usingClass.hpp"
// 因为不能在创建对象的时候为其赋值,如果能够赋值,有违背私有化数据隐藏,所以产生了构造方法,专门为了创建类对象和类对象的初始化而设立
DefineAClass::DefineAClass(const std::string &co, long n, double pr)        
// 其中构造函数中的形参是给构造函数中的值,为例避免名称混乱,一般使用"m_"或者"名称_"这样的标识符区别,不像java中的有this
// 还有一点: 这里的构造方法可以使用默认参数,就像默认方法一样
{
    company = co;
    if (n<0)
    {
        std::cerr << "Number of shares can't be negative; " << company << " shares ser to 0." << std::endl;
        shares = 0;
    }else{
        shares = n;
    }share_val = pr;
    set_tot();
}
// 上面的函数就是一个构造函数,以类型名称命名

// 默认构造函数
// DefineAClass dac;
// 上面的函数使用了默认构造函数,如果一个类没有提供任何的构造函数,则C++将会创建一个默认的构造函数,大概像这样:
// DefineAClass::DefineAClass(){ };     // 他是默认构造函数的隐式版本
// !!重要: !! 当且仅当没有定义任何构造函数时,编译器才会提供默认构造函数,但是如果提供了非默认构造函数,而没有显示的指出默认构造函数,"DefineAClass dac;"这样的声明将会出错
// 这样设计的原因可能是为了禁止创建未初始化的对象


// 使用构造函数
// DefineAClass dac;        // 创建一个DefineAClass类的对象
// DefineAClass dac = DefineAClass();       // 显式地调用构造方法
// DefineAClass *dac = new DefineAClass;    // 使用new显式地调用构造方法

// 不要被误导
// DefineAClass first("aquawius!!!");     // 调用带有参数的构造方法,创建一个叫做first的类实例
// DefineAClass second();                 // 声明一个方法!!!
// DefineAClass third;                    // 创建一个third的类实例


// 在C++11中列表初始化同样也可以初始化类
// 比如说这样的
// DefineAClass dac = {"aquawius",10,10.2};
// DefineAClass dac{"AQUAWIUS",18,18};
// 使用大括号括起来的应该与形参构造方法中的参数列表使用的形参类型一致


